perm filename EVAL3.PR[E81,JMC] blob sn#598913 filedate 1981-07-09 generic text, type T, neo UTF8
assoc(X,[],[]).
assoc(X,[[X1|Y]|Z],R) :- X=X1,R=[X|Y]; X\==X1,assoc(X,Z,R).

eval([equal,X,X],←,true).
eval([equal,X1,X2],U,R) :- eval(X1,U,Y1),eval(X2,U,Y2),
			   (Y1=Y2,R=true ; Y1\==Y2,R=[]).
eval([atom,X],U,R) :- eval(X,U,Y),Y=..[←|A],(A=[],R=true ; A\==[],R=[]).
eval([null,X],U,R) :- eval(X,U,Y),(Y=[],R=true ; Y\==[],R=[]).
eval([],←,[]).
eval([quote,Y],←,Y).
eval([car,X],U,Y) :- eval(X,U,[Y|←]).
eval([cdr,X],U,Y) :- eval(X,U,[←|Y]).
eval([cons,X,X1],U,[Y|Y1]) :- eval(X,U,Y),eval(X1,U,Y1).
eval([if,P,A,B],U,Y) :- eval(P,U,R),(R=true,eval(A,U,Y) ; R=[],eval(B,U,Y)).
eval([[lambda,V,E],W],U,Y) :- eval(W,U,Y1),eval(E,[[V|Y1]|U],Y).
eval([F,Z],U,Y) :- eval(F,U,F1),eval([F1,Z],U,Y).
eval(V,U,Y) :- atomic(V),assoc(V,U,[V|Y]).

assertff :- asserta(eval(ff,←,[lambda,x,[if,[atom,x],x,[ff,[car,x]]]])).

assertalt :- asserta(eval(alt,←,[lambda,u,[if,[null,u],[],
[if,[null,[cdr,u]],u,[cons,[car,u],[alt,[cdr,[cdr,u]]]]]]])).

assertislist :- asserta(eval(islist,←,[lambda,u,[if,[null,u],[quote,true],
[islist,[cdr,u]]]])).

:-end.